package br.com.vpsa.previdordevendas.model.service.impl;

import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.List;

import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;
import javax.persistence.TypedQuery;

import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import br.com.vpsa.previdordevendas.model.entity.Investimento;
import br.com.vpsa.previdordevendas.model.service.InvestimetoService;

@Service
public class InvestimentoServiceImpl implements InvestimetoService
{

    @PersistenceContext
    private EntityManager em;
	
	@Override
	@Transactional
	public void salvarInvestimento(Investimento investimento) {

		investimento.setRendimentoPrimeiroMes( calculaRendimentoPrimeiroMes(investimento) );
		
		em.persist(investimento);
	}

    public BigDecimal calculaRendimentoPrimeiroMes( Investimento investimento )
    {
    	BigDecimal result = null;
    	
    	if( investimento.getDepreciacaoAnual() != null && investimento.getDepreciacaoAnual() > 0 )
    	{
    		int mesCentralPayBack = investimento.getMesesPayBack() / 2;
    		
    		BigDecimal valorCentralPayBack = investimento.getValor().divide( new BigDecimal(investimento.getMesesPayBack()), 2, RoundingMode.HALF_EVEN);
    		
    		result = valorCentralPayBack;
    		
    		for( int mes=mesCentralPayBack ; mes > 0 ; mes-- )
    		{
    			result = result.divide( BigDecimal.ONE.subtract(investimento.getDepreciacaoPercentualMensal()), 2, RoundingMode.HALF_EVEN );
    		}
    	}
    	
    	return result;
    }	
	
	@Override
	public List<Investimento> listarTodos(String base) 
	{
		String hql = "from Investimento i where i.base = :base";

		TypedQuery<Investimento> query = em.createQuery(hql, Investimento.class);
		query.setParameter("base", base);
		
		return query.getResultList();
	}

	@Override
	public List<Investimento> listar(String base, Long idEntidade) 
	{
		String hql = "from Investimento i where i.base = :base";
				
		if( idEntidade != null ){
			hql += " and i.idEntidade = :idEntidade";
		}
		
		TypedQuery<Investimento> query = em.createQuery(hql, Investimento.class);
		query.setParameter("base", base);
		
		if( idEntidade != null ){
			query.setParameter("idEntidade", idEntidade);
		}
			
		return query.getResultList();
	}

	@Override
	@Transactional
	public void remover(long idInvestimento) 
	{
		String hql = "delete from Investimento i where i.id = :idInvestimento";
		
		Query query = em.createQuery(hql);
		query.setParameter("idInvestimento", idInvestimento);
		
		query.executeUpdate();
	}

}
